# -*- coding: utf-8 -*-
import logging

from flask import g, request, jsonify, session

from ihome_main import constants, db
from ihome_main.api_1_0 import api
from ihome_main.models import User
from ihome_main.utils.commons import login_required
from ihome_main.utils.image_storage import storage
from ihome_main.utils.response_code import RET


@api.route("/users/avatar",methods=["POST"])
@login_required
def set_user_avatar():
    """设置用户头像"""
    #获取参数，头像图片／用户
    user_id = g.user_id
    image_file = request.files.get("avatar")
    #校验参数
    if image_file is None:
        #表示用户没有上传头像
        return jsonify(errno = RET.PARAMERR,errmsg="未上传头像")
    #保存用户头像
    image_data = image_file.read()
    try:
        file_name = storage(image_data)
    except Exception as e:
        logging.error(e)
        return jsonify(errno = RET.THIRDERR,errmsg="上传头像异常")
    #将文件名信息保存到数据库中
    try:
        print("*"*20)
        print(user_id)
        # User.query.filter_by(id=user_id).update({"avatar_url": file_name})
        user = User.query.filter_by(id = user_id).first()
        user.avatar_url = file_name
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        logging.error(e)
        return jsonify(errno = RET.DBERR,errmsg="保存头像信息失败")
    avatar_url = constants.QINIU_URL_DOMAIN+file_name
    #返回值
    return jsonify(errno = RET.OK,errmsg="保存头像成功",data={"avatar_url": avatar_url})

# @api.route('/touxiang')
# @login_required
# def get_touxiang():
#     '''获取用户的头像信息'''
#     user_id = g.user_id
#     user = User.query.filter_by(id=user_id).first()
#     file_name = user.avatar_url
#     url = constants.QINIU_URL_DOMAIN+file_name
#     return jsonify(tupian_url = url)

@api.route("/user/name",methods=["PUT"])
@login_required
def change_user_name():
    """修改用户名"""
    #使用了login_required装饰其后，可以获取g对象中获取用户user_id
    user_id = g.user_id
    #获取用户想要设置的用户名
    req_data = request.get_json()
    if not req_data:
        return jsonify(errno=RET.PARAMERR,errmsg="参数不完整")
    name = req_data.get("name") #用户想要设置的名字
    if not name:
        return jsonify(errno=RET.PARAMERR, errmsg="名字不能为空")
    #保存用户昵称name,并同时判断name是否重复（利用数据库的唯一索引）
    try:
        User.query.filter_by(id=user_id).update({"name": name})
        db.session.commit()
    except Exception as e:
        logging.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg="设置用户错误")
    #修改session数据ｖ中的name字段
    session["user_name"]= name
    return jsonify(errno=RET.OK, errmsg="OK", data={"name": name})

@api.route("/user", methods=["GET"])
@login_required
def get_user_profile():
    """获取个人信息"""
    user_id = g.user_id
    # 查询数据库获取个人信息
    try:
        user = User.query.get(user_id)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg="获取用户信息失败")

    if user is None:
        return jsonify(errno=RET.NODATA, errmsg="无效操作")

    return jsonify(errno=RET.OK, errmsg="OK", data=user.to_dict())

@api.route("/user/auth")
@login_required
def get_user_auth():
    """获取用户的实名认证信息"""
    user_id = g.user_id
    #在数据库中查询信息
    try:
        user=User.query.get(user_id)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR,errmsg="获取用户实名信息失败")
    if user is None:
        return jsonify(errno=RET.NODATA,errmsg="无效操作")
    return jsonify(errno=RET.OK,errmsg="OK",data=user.auth_to_dict())

@api.route("/user/auth",methods=["POST"])
@login_required
def set_user_auth():
    """保存实名认证信息"""
    user_id = g.user_id
    #获取参数
    req_data = request.get_json()
    if not req_data:
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    real_name=req_data.get("real_name") #真实姓名
    id_card=req_data.get("id_card") #身份证号

    #校验参数
    if not all([real_name,id_card]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    #保存用户的姓名与省份证号
    try:
        User.query.filter_by(id=user_id,real_name=None,id_card=None).update({"real_name": real_name, "id_card": id_card})
        db.session.commit()
    except Exception as e:
        logging.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="保存用户实名信息失败")
    return jsonify(errno=RET.OK, errmsg="OK")
